/*
 * This file is part of "JTA - Telnet/SSH for the JAVA(tm) platform".
 *
 * (c) Matthias L. Jugel, Marcus Meißner 1996-2005. All Rights Reserved.
 *
 * Please visit http://javatelnet.org/ for updates and contact.
 *
 * --LICENSE NOTICE--
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 * --LICENSE NOTICE--
 *
 */

package TelnetClient.dependencies;

import java.awt.*;
import java.util.*;

/**
 * Any characters that are not available in standard java fonts may be drawn
 * using the softfont utility. This utility class was derived from the cpi fonts
 * used in linux console drivers.
 * <P>
 * <small>Font file generated by cpi2fnt</small>
 * <P>
 * <B>Maintainer:</B> Marcus Meissner
 * 
 * @version $Id: SoftFont.java 499 2005-09-29 08:24:54Z leo $
 * @author Matthias L. Jugel, Marcus Meissner
 */
public class SoftFont
{
    final static private char SF_BITMAP = 0;
    final static private char SF_FILLRECT = 1;

    final static private char SF_CHAR = 0;
    final static private char SF_WIDTH = 1;
    final static private char SF_HEIGHT = 2;
    final static private char SF_TYPE = 3;
    final static private char SF_DATA = 4;
    java.util.Hashtable font;
    /** softfont characterdata */
    private static char[][] fontdata =
    {

    { 0x01, 8, 8, SF_BITMAP, /* 1 0x01 '^A' */
    0x7e, /* 01111110 */
    0x81, /* 10000001 */
    0xa5, /* 10100101 */
    0x81, /* 10000001 */
    0xbd, /* 10111101 */
    0x99, /* 10011001 */
    0x81, /* 10000001 */
    0x7e, /* 01111110 */
    },
    { 0x02, 8, 8, SF_BITMAP,/* 2 0x02 '^B' */
    0x7e, /* 01111110 */
    0xff, /* 11111111 */
    0xdb, /* 11011011 */
    0xff, /* 11111111 */
    0xc3, /* 11000011 */
    0xe7, /* 11100111 */
    0xff, /* 11111111 */
    0x7e, /* 01111110 */
    },
    { 0x03, 8, 8, SF_BITMAP,/* 3 0x03 '^C' */
    0x6c, /* 01101100 */
    0xfe, /* 11111110 */
    0xfe, /* 11111110 */
    0xfe, /* 11111110 */
    0x7c, /* 01111100 */
    0x38, /* 00111000 */
    0x10, /* 00010000 */
    0x00, /* 00000000 */
    },
    { 0x04, 8, 8, SF_BITMAP,/* 4 0x04 '^D' */
    0x10, /* 00010000 */
    0x38, /* 00111000 */
    0x7c, /* 01111100 */
    0xfe, /* 11111110 */
    0x7c, /* 01111100 */
    0x38, /* 00111000 */
    0x10, /* 00010000 */
    0x00, /* 00000000 */
    },
    { 0x05, 8, 8, SF_BITMAP,/* 5 0x05 '^E' */
    0x38, /* 00111000 */
    0x7c, /* 01111100 */
    0x38, /* 00111000 */
    0xfe, /* 11111110 */
    0xfe, /* 11111110 */
    0xd6, /* 11010110 */
    0x10, /* 00010000 */
    0x38, /* 00111000 */
    },
    { 0x06, 8, 8, SF_BITMAP,/* 6 0x06 '^F' */
    0x10, /* 00010000 */
    0x38, /* 00111000 */
    0x7c, /* 01111100 */
    0xfe, /* 11111110 */
    0xfe, /* 11111110 */
    0x7c, /* 01111100 */
    0x10, /* 00010000 */
    0x38, /* 00111000 */
    },
    { 0x2666, 8, 8, SF_BITMAP,/* 9830 0x2666 BLACK DIAMOND */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    0x18, /* 00011000 */
    0x3c, /* 00111100 */
    0x3c, /* 00111100 */
    0x18, /* 00011000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    },
    { 0x07, 8, 8, SF_BITMAP,/* 7 0x07 '^G' */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    0x18, /* 00011000 */
    0x3c, /* 00111100 */
    0x3c, /* 00111100 */
    0x18, /* 00011000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    },
    { 0x08, 8, 8, SF_BITMAP,/* 8 0x08 '^H' */
    0xff, /* 11111111 */
    0xff, /* 11111111 */
    0xe7, /* 11100111 */
    0xc3, /* 11000011 */
    0xc3, /* 11000011 */
    0xe7, /* 11100111 */
    0xff, /* 11111111 */
    0xff, /* 11111111 */
    },
    { 0x09, 8, 8, SF_BITMAP,/* 9 0x09 '^I' */
    0x00, /* 00000000 */
    0x3c, /* 00111100 */
    0x66, /* 01100110 */
    0x42, /* 01000010 */
    0x42, /* 01000010 */
    0x66, /* 01100110 */
    0x3c, /* 00111100 */
    0x00, /* 00000000 */
    },
    { 0x0a, 8, 8, SF_BITMAP,/* 10 0x0a '^J' */
    0xff, /* 11111111 */
    0xc3, /* 11000011 */
    0x99, /* 10011001 */
    0xbd, /* 10111101 */
    0xbd, /* 10111101 */
    0x99, /* 10011001 */
    0xc3, /* 11000011 */
    0xff, /* 11111111 */
    },
    { 0x0b, 8, 8, SF_BITMAP,/* 11 0x0b '^K' */
    0x0f, /* 00001111 */
    0x07, /* 00000111 */
    0x0f, /* 00001111 */
    0x7d, /* 01111101 */
    0xcc, /* 11001100 */
    0xcc, /* 11001100 */
    0xcc, /* 11001100 */
    0x78, /* 01111000 */
    },
    { 0x0c, 8, 8, SF_BITMAP,/* 12 0x0c '^L' */
    0x3c, /* 00111100 */
    0x66, /* 01100110 */
    0x66, /* 01100110 */
    0x66, /* 01100110 */
    0x3c, /* 00111100 */
    0x18, /* 00011000 */
    0x7e, /* 01111110 */
    0x18, /* 00011000 */
    },
    { 0x0d, 8, 8, SF_BITMAP,/* 13 0x0d '^M' */
    0x3f, /* 00111111 */
    0x33, /* 00110011 */
    0x3f, /* 00111111 */
    0x30, /* 00110000 */
    0x30, /* 00110000 */
    0x70, /* 01110000 */
    0xf0, /* 11110000 */
    0xe0, /* 11100000 */
    },
    { 0x0e, 8, 8, SF_BITMAP,/* 14 0x0e '^N' */
    0x7f, /* 01111111 */
    0x63, /* 01100011 */
    0x7f, /* 01111111 */
    0x63, /* 01100011 */
    0x63, /* 01100011 */
    0x67, /* 01100111 */
    0xe6, /* 11100110 */
    0xc0, /* 11000000 */
    },
    { 0x0f, 8, 8, SF_BITMAP,/* 15 0x0f '^O' */
    0x18, /* 00011000 */
    0xdb, /* 11011011 */
    0x3c, /* 00111100 */
    0xe7, /* 11100111 */
    0xe7, /* 11100111 */
    0x3c, /* 00111100 */
    0xdb, /* 11011011 */
    0x18, /* 00011000 */
    },
    { 0x10, 8, 8, SF_BITMAP,/* 16 0x10 '^P' */
    0x80, /* 10000000 */
    0xe0, /* 11100000 */
    0xf8, /* 11111000 */
    0xfe, /* 11111110 */
    0xf8, /* 11111000 */
    0xe0, /* 11100000 */
    0x80, /* 10000000 */
    0x00, /* 00000000 */
    },
    { 0x11, 8, 8, SF_BITMAP,/* 17 0x11 '^Q' */
    0x02, /* 00000010 */
    0x0e, /* 00001110 */
    0x3e, /* 00111110 */
    0xfe, /* 11111110 */
    0x3e, /* 00111110 */
    0x0e, /* 00001110 */
    0x02, /* 00000010 */
    0x00, /* 00000000 */
    },
    { 0x12, 8, 8, SF_BITMAP,/* 18 0x12 '^R' */
    0x18, /* 00011000 */
    0x3c, /* 00111100 */
    0x7e, /* 01111110 */
    0x18, /* 00011000 */
    0x18, /* 00011000 */
    0x7e, /* 01111110 */
    0x3c, /* 00111100 */
    0x18, /* 00011000 */
    },
    { 0x13, 8, 8, SF_BITMAP,/* 19 0x13 '^S' */
    0x66, /* 01100110 */
    0x66, /* 01100110 */
    0x66, /* 01100110 */
    0x66, /* 01100110 */
    0x66, /* 01100110 */
    0x00, /* 00000000 */
    0x66, /* 01100110 */
    0x00, /* 00000000 */
    },
    { 0x14, 8, 8, SF_BITMAP,/* 20 0x14 '^T' */
    0x7f, /* 01111111 */
    0xdb, /* 11011011 */
    0xdb, /* 11011011 */
    0x7b, /* 01111011 */
    0x1b, /* 00011011 */
    0x1b, /* 00011011 */
    0x1b, /* 00011011 */
    0x00, /* 00000000 */
    },
    { 0x15, 8, 8, SF_BITMAP,/* 21 0x15 '^U' */
    0x3e, /* 00111110 */
    0x61, /* 01100001 */
    0x3c, /* 00111100 */
    0x66, /* 01100110 */
    0x66, /* 01100110 */
    0x3c, /* 00111100 */
    0x86, /* 10000110 */
    0x7c, /* 01111100 */
    },
    { 0x16, 8, 8, SF_BITMAP,/* 22 0x16 '^V' */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    0x7e, /* 01111110 */
    0x7e, /* 01111110 */
    0x7e, /* 01111110 */
    0x00, /* 00000000 */
    },
    { 0x17, 8, 8, SF_BITMAP,/* 23 0x17 '^W' */
    0x18, /* 00011000 */
    0x3c, /* 00111100 */
    0x7e, /* 01111110 */
    0x18, /* 00011000 */
    0x7e, /* 01111110 */
    0x3c, /* 00111100 */
    0x18, /* 00011000 */
    0xff, /* 11111111 */
    },
    { 0x18, 8, 8, SF_BITMAP,/* 24 0x18 '^X' */
    0x18, /* 00011000 */
    0x3c, /* 00111100 */
    0x7e, /* 01111110 */
    0x18, /* 00011000 */
    0x18, /* 00011000 */
    0x18, /* 00011000 */
    0x18, /* 00011000 */
    0x00, /* 00000000 */
    },
    { 0x19, 8, 8, SF_BITMAP,/* 25 0x19 '^Y' */
    0x18, /* 00011000 */
    0x18, /* 00011000 */
    0x18, /* 00011000 */
    0x18, /* 00011000 */
    0x7e, /* 01111110 */
    0x3c, /* 00111100 */
    0x18, /* 00011000 */
    0x00, /* 00000000 */
    },
    { 0x1a, 8, 8, SF_BITMAP,/* 26 0x1a '^Z' */
    0x00, /* 00000000 */
    0x18, /* 00011000 */
    0x0c, /* 00001100 */
    0xfe, /* 11111110 */
    0x0c, /* 00001100 */
    0x18, /* 00011000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    },
    { 0x1b, 8, 8, SF_BITMAP,/* 27 0x1b '^[' */
    0x00, /* 00000000 */
    0x30, /* 00110000 */
    0x60, /* 01100000 */
    0xfe, /* 11111110 */
    0x60, /* 01100000 */
    0x30, /* 00110000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    },
    { 0x1c, 8, 8, SF_BITMAP,/* 28 0x1c '^\' */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    0xc0, /* 11000000 */
    0xc0, /* 11000000 */
    0xc0, /* 11000000 */
    0xfe, /* 11111110 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    },
    { 0x1d, 8, 8, SF_BITMAP,/* 29 0x1d '^]' */
    0x00, /* 00000000 */
    0x24, /* 00100100 */
    0x66, /* 01100110 */
    0xff, /* 11111111 */
    0x66, /* 01100110 */
    0x24, /* 00100100 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    },
    { 0x1e, 8, 8, SF_BITMAP,/* 30 0x1e '^^' */
    0x00, /* 00000000 */
    0x18, /* 00011000 */
    0x3c, /* 00111100 */
    0x7e, /* 01111110 */
    0xff, /* 11111111 */
    0xff, /* 11111111 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    },
    { 0x1f, 8, 8, SF_BITMAP,/* 31 0x1f '^_' */
    0x00, /* 00000000 */
    0xff, /* 11111111 */
    0xff, /* 11111111 */
    0x7e, /* 01111110 */
    0x3c, /* 00111100 */
    0x18, /* 00011000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    },
    { 0x7f, 8, 8, SF_BITMAP,/* 127 0x7f '' */
    0x00, /* 00000000 */
    0x10, /* 00010000 */
    0x38, /* 00111000 */
    0x6c, /* 01101100 */
    0xc6, /* 11000110 */
    0xc6, /* 11000110 */
    0xfe, /* 11111110 */
    0x00, /* 00000000 */
    },
    { 0x2591, 8, 8, SF_BITMAP,/* LIGHT SHADE */
    0x22, /* 00100010 */
    0x88, /* 10001000 */
    0x22, /* 00100010 */
    0x88, /* 10001000 */
    0x22, /* 00100010 */
    0x88, /* 10001000 */
    0x22, /* 00100010 */
    0x88, /* 10001000 */
    },
    { 0x2592, 8, 8, SF_BITMAP,/* MEDIUM SHADE */
    0x55, /* 01010101 */
    0xaa, /* 10101010 */
    0x55, /* 01010101 */
    0xaa, /* 10101010 */
    0x55, /* 01010101 */
    0xaa, /* 10101010 */
    0x55, /* 01010101 */
    0xaa, /* 10101010 */
    },
    { 0x2593, 8, 8, SF_BITMAP,/* DARK SHADE */
    0x77, /* 01110111 */
    0xdd, /* 11011101 */
    0x77, /* 01110111 */
    0xdd, /* 11011101 */
    0x77, /* 01110111 */
    0xdd, /* 11011101 */
    0x77, /* 01110111 */
    0xdd, /* 11011101 */
    },
    { 0x221a, 8, 8, SF_BITMAP,/* SQUARE ROOT */
    0x78, /* 01111000 */
    0x0c, /* 00001100 */
    0x18, /* 00011000 */
    0x30, /* 00110000 */
    0x7c, /* 01111100 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    },
    { 0x2320, 8, 8, SF_FILLRECT,/* UPPER INTERVAL */
    0x4031, 0x3127, 0x6122,
    /* 00001110 */
    /* 00011011 */
    /* 00011011 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2321, 8, 8, SF_FILLRECT,/* BOTTOM HALF INTEGRAL */
    0x3027, 0x0522, 0x1731,
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 11011000 */
    /* 11011000 */
    /* 01110000 */
    },
    { 0x25a0, 8, 8, SF_FILLRECT,/* BLACK SQUARE */
    0x2244,
    /* 00000000 */
    /* 00000000 */
    /* 00111100 */
    /* 00111100 */
    /* 00111100 */
    /* 00111100 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2502, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT VERTICAL */
    0x3028,
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2524, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
    0x3028, 0x0431,
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 11111000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2561, 8, 8, SF_FILLRECT,/* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE */
    0x3028, 0x0231, 0x0431,
    /* 00011000 */
    /* 00011000 */
    /* 11111000 */
    /* 00011000 */
    /* 11111000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2562, 8, 8, SF_FILLRECT,/* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE */
    0x2028, 0x5028, 0x0421,
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 11110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x2556, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE */
    0x0471, 0x2523, 0x5523,
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 11111110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x2555, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE */
    0x3226, 0x0231, 0x0431,
    /* 00000000 */
    /* 00000000 */
    /* 11111000 */
    /* 00011000 */
    /* 11111000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2563, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */
    0x2022, 0x0221, 0x0421, 0x2424, 0x5028,
    /* 00110110 */
    /* 00110110 */
    /* 11110110 */
    /* 00000110 */
    /* 11110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x2551, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE VERTICAL */
    0x2028, 0x5028,
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x2557, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE DOWN AND LEFT */
    0x0271, 0x5325, 0x0441, 0x2523,
    /* 00000000 */
    /* 00000000 */
    /* 11111110 */
    /* 00000110 */
    /* 11110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x255d, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE UP AND LEFT */
    0x2022, 0x0241, 0x5025, 0x0451,
    /* 00110110 */
    /* 00110110 */
    /* 11110110 */
    /* 00000110 */
    /* 11111110 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x255c, 8, 8, SF_FILLRECT,/* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE */
    0x2024, 0x5024, 0x0471,
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 11111110 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x255b, 8, 8, SF_FILLRECT,/* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE */
    0x3025, 0x0231, 0x0431,
    /* 00011000 */
    /* 00011000 */
    /* 11111000 */
    /* 00011000 */
    /* 11111000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2510, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT DOWN AND LEFT */
    0x0451, 0x3523,
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 11111000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2514, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT UP AND RIGHT */
    0x3025, 0x5431,
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2534, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
    0x3024, 0x0481,
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 11111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x252c, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
    0x0481, 0x3523,
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 11111111 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x251c, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
    0x3028, 0x5431,
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011111 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2500, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT HORIZONTAL */
    0x0481,
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 11111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2594, 8, 8, SF_FILLRECT,/* UPPER 1/8 (1st scanline) */
    0x0081,
    /* 11111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x25ac, 8, 8, SF_FILLRECT,/* LOWER 1/8 (7nd scanline) */
    0x0781,
    /* 11111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x253c, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
    0x3028, 0x0481,
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 11111111 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x255e, 8, 8, SF_FILLRECT,/* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE */
    0x3028, 0x5231, 0x5431,
    /* 00011000 */
    /* 00011000 */
    /* 00011111 */
    /* 00011000 */
    /* 00011111 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x255f, 8, 8, SF_FILLRECT,/* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE */
    0x2028, 0x5028, 0x7411,
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110111 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x255a, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE UP AND RIGHT */
    0x2025, 0x5023, 0x7211, 0x4441,
    /* 00110110 */
    /* 00110110 */
    /* 00110111 */
    /* 00110000 */
    /* 00111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2554, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE DOWN AND RIGHT */
    0x2261, 0x2325, 0x5424, 0x7411,
    /* 00000000 */
    /* 00000000 */
    /* 00111111 */
    /* 00110000 */
    /* 00110111 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x2569, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */
    0x2022, 0x0241, 0x5022, 0x5231, 0x0481,
    /* 00110110 */
    /* 00110110 */
    /* 11110111 */
    /* 00000000 */
    /* 11111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2566, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */
    0x0281, 0x0441, 0x2523, 0x5431, 0x5523,
    /* 00000000 */
    /* 00000000 */
    /* 11111111 */
    /* 00000000 */
    /* 11110111 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x2560, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */
    0x2028, 0x5022, 0x5231, 0x5431, 0x5623,
    /* 00110110 */
    /* 00110110 */
    /* 00110111 */
    /* 00110000 */
    /* 00110111 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x2550, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE HORIZONTAL */
    0x0281, 0x0481,
    /* 00000000 */
    /* 00000000 */
    /* 11111111 */
    /* 00000000 */
    /* 11111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x256c, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */
    0x2022, 0x0241, 0x5022, 0x5231, 0x0441, 0x2523, 0x5431, 0x5523,
    /* 00110110 */
    /* 00110110 */
    /* 11110111 */
    /* 00000000 */
    /* 11110111 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x2567, 8, 8, SF_FILLRECT,/* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE */
    0x3022, 0x0281, 0x0481,
    /* 00011000 */
    /* 00011000 */
    /* 11111111 */
    /* 00000000 */
    /* 11111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2568, 8, 8, SF_FILLRECT,/* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE */
    0x2024, 0x5024, 0x0481,
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 11111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2564, 8, 8, SF_FILLRECT,/*
				 * BOX DRAWINGS DOWN SINGLE AND HORIZONTAL
				 * DOUBLE
				 */
    0x0281, 0x0481, 0x3523,
    /* 00000000 */
    /* 00000000 */
    /* 11111111 */
    /* 00000000 */
    /* 11111111 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2565, 8, 8, SF_FILLRECT,/*
				 * BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL
				 * SINGLE
				 */
    0x0481, 0x2523, 0x5523,
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 11111111 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x2559, 8, 8, SF_FILLRECT,/* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE */
    0x2024, 0x5024, 0x2461,
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2558, 8, 8, SF_FILLRECT,/* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE */
    0x3025, 0x5231, 0x5431,
    /* 00011000 */
    /* 00011000 */
    /* 00011111 */
    /* 00011000 */
    /* 00011111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2552, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE */
    0x3226, 0x5231, 0x5431,
    /* 00000000 */
    /* 00000000 */
    /* 00011111 */
    /* 00011000 */
    /* 00011111 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2553, 8, 8, SF_FILLRECT,/* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE */
    0x2461, 0x2523, 0x5523,
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00111111 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x256b, 8, 8, SF_FILLRECT,/*
				 * BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL
				 * SINGLE
				 */
    0x2028, 0x5028, 0x0481,
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    /* 11111111 */
    /* 00110110 */
    /* 00110110 */
    /* 00110110 */
    },
    { 0x256a, 8, 8, SF_FILLRECT,/*
				 * BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL
				 * DOUBLE
				 */
    0x3028, 0x0281, 0x0481,
    /* 00011000 */
    /* 00011000 */
    /* 11111111 */
    /* 00011000 */
    /* 11111111 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2518, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT UP AND LEFT */
    0x3025, 0x0431,
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    /* 11111000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x250c, 8, 8, SF_FILLRECT,/* BOX DRAWINGS LIGHT DOWN AND RIGHT */
    0x3451, 0x3523,
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00011111 */
    /* 00011000 */
    /* 00011000 */
    /* 00011000 */
    },
    { 0x2588, 8, 8, SF_FILLRECT,/* FULL BLOCK */
    0x0088,
    /* 11111111 */
    /* 11111111 */
    /* 11111111 */
    /* 11111111 */
    /* 11111111 */
    /* 11111111 */
    /* 11111111 */
    /* 11111111 */
    },
    { 0x2584, 8, 8, SF_FILLRECT,/* LOWER HALF BLOCK */
    0x0484,
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 11111111 */
    /* 11111111 */
    /* 11111111 */
    /* 11111111 */
    },
    { 0x258c, 8, 8, SF_FILLRECT,/* LEFT HALF BLOCK */
    0x0048,
    /* 11110000 */
    /* 11110000 */
    /* 11110000 */
    /* 11110000 */
    /* 11110000 */
    /* 11110000 */
    /* 11110000 */
    /* 11110000 */
    },
    { 0x2590, 8, 8, SF_FILLRECT,/* RIGHT HALF BLOCK */
    0x4048,
    /* 00001111 */
    /* 00001111 */
    /* 00001111 */
    /* 00001111 */
    /* 00001111 */
    /* 00001111 */
    /* 00001111 */
    /* 00001111 */
    },
    { 0x2580, 8, 8, SF_FILLRECT,/* UPPER HALF BLOCK */
    0x0084,
    /* 11111111 */
    /* 11111111 */
    /* 11111111 */
    /* 11111111 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2261, 8, 8, SF_FILLRECT,/* EQUIVALENT SIGN */
    0x2081, 0x4081, 0x6081,
    /* 00000000 */
    /* 00000000 */
    /* 11111111 */
    /* 00000000 */
    /* 11111111 */
    /* 00000000 */
    /* 11111111 */
    /* 00000000 */
    },
    { 0x221e, 8, 8, SF_BITMAP,/* INFINITY */
    0x00, 0x00, 0x7e, 0xdb, 0xdb, 0x7e, 0x00, 0x00,
    /* 00000000 */
    /* 00000000 */
    /* 01111110 */
    /* 11011011 */
    /* 11011011 */
    /* 01111110 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x207f, 8, 8, SF_FILLRECT,/* small superscript n */
    0x1041, 0x1124, 0x4124,
    /* 01111000 */
    /* 01101100 */
    /* 01101100 */
    /* 01101100 */
    /* 01101100 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x00b2, 8, 8, SF_BITMAP,/* small superscript 2 */
    0x70, /* 01110000 */
    0x1c, /* 00011100 */
    0x38, /* 00111000 */
    0x60, /* 01100000 */
    0x78, /* 01111000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    0x00, /* 00000000 */
    },
    { 0x2219, 8, 8, SF_FILLRECT,/* BULLET OPERATOR */
    0x3322,
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    /* 00011000 */
    /* 00011000 */
    /* 00000000 */
    /* 00000000 */
    /* 00000000 */
    },
    { 0x2191, 8, 8, SF_BITMAP,/* UP ARROW */
    0x08, /* 00001000 */
    0x1c, /* 00011100 */
    0x3e, /* 00111110 */
    0x7f, /* 01111111 */
    0x1c, /* 00011100 */
    0x1c, /* 00011100 */
    0x1c, /* 00011100 */
    0x1c, /* 00011100 */
    },
    { 0x2193, 8, 8, SF_BITMAP,/* DOWN ARROW */
    0x1c, /* 00011100 */
    0x1c, /* 00011100 */
    0x1c, /* 00011100 */
    0x1c, /* 00011100 */
    0x7f, /* 01111111 */
    0x3e, /* 00111110 */
    0x1c, /* 00011100 */
    0x08, /* 00001000 */
    },
    { 0x25ba, 8, 8, SF_BITMAP,/* RIGHT ARROW (TRIANGLE ONLY) */
    0x00, /* 00000000 */
    0x40, /* 01000000 */
    0x60, /* 01100000 */
    0x7c, /* 01111100 */
    0x70, /* 01110000 */
    0x60, /* 01100000 */
    0x40, /* 01000000 */
    0x00, /* 00000000 */
    },
    { 0x25c4, 8, 8, SF_BITMAP,/* LEFT ARROW (TRIANGLE ONLY) */
    0x00, /* 00000000 */
    0x02, /* 00000010 */
    0x06, /* 00000110 */
    0x3e, /* 00111110 */
    0x0e, /* 00001110 */
    0x06, /* 00000110 */
    0x02, /* 00000010 */
    0x00, /* 00000000 */
    } };

    public SoftFont()
    {
	font = new java.util.Hashtable();
	for (int i = 0; i < fontdata.length; i++)
	    font.put(new Integer(fontdata[i][0]), new Integer(i));

    }

    public boolean inSoftFont(char c)
    {
	boolean insoftfont;

	insoftfont = (null != font.get(new Integer(c)));
	if (!insoftfont && (int) c >= 0x100)
	{
	    System.out.println("Character " + ((int) c) + " not in softfont");
	}
	return insoftfont;
    }

    public void drawChar(Graphics g, char c, int x, int y, int cw, int ch)
    {
	double dw, dh;
	Object Ientry;
	int w, h, entry, i, fontwidth, fontheight;

	Ientry = font.get(new Integer(c));
	if (Ientry == null)
	    return;
	entry = ((Integer) Ientry).intValue();
	fontwidth = fontdata[entry][SF_WIDTH];
	fontheight = fontdata[entry][SF_HEIGHT];

	dw = cw * 1.0 / fontwidth;
	dh = ch * 1.0 / fontheight;

	switch (fontdata[entry][SF_TYPE])
	{
	case SF_BITMAP:
	    for (h = 0; h < fontheight; h++)
	    {
		for (w = 0; w < fontwidth; w++)
		{
		    // FIXME: 8 bit max currently...
		    if (0 != (fontdata[entry][h + SF_DATA] & (1 << (7 - w))))
		    {
			g.fillRect(x + (int) (w * dw), y + (int) (h * dh),
				((int) ((w + 1) * dw)) - (int) (w * dw),
				((int) ((h + 1) * dh)) - (int) (h * dh));
		    }
		}
	    }
	    break;
	case SF_FILLRECT:
	    i = SF_DATA;
	    while (i < fontdata[entry].length)
	    {
		int xw, xh;

		w = (fontdata[entry][i] & 0xF000) >> 12;
		h = (fontdata[entry][i] & 0x0F00) >> 8;
		xw = (fontdata[entry][i] & 0x00F0) >> 4;
		xh = (fontdata[entry][i] & 0x000F);
		g.fillRect(x + (int) (w * dw), y + (int) (h * dh),
			((int) ((w + xw) * dw)) - (int) (w * dw),
			((int) ((h + xh) * dh)) - (int) (h * dh));
		i++;
	    }
	    break;
	default:
	    break;
	}
    }
}
